約 2,575,657 件
https://w.atwiki.jp/ookubo/pages/19.html
ゲームテクニック ゲームに関する情報 OpenGL の描画処理を高速化についてのkeyWard. ・ディスプレイリスト ・頂点配列 ・VBO = Vertex Buffer Object ・カリング カリング- OpenGLビュークラスを作る- OpenGL サンプル --
https://w.atwiki.jp/cglab/pages/22.html
初心者向けチュートリアル 筑波大学岩田研究室 OpenGLのゼミの資料を公開なさっています。 ◆◇ 高速OpenGL講座 ◇◆ 九州大学 大学院 のOpenGL講座 内容を絞ってあるので、コストパフォーマンスに優れます。しかし、auxライブラリを使用しているのでglutへの修正が必要です。ちなみにauxライブラリはglutライブラリの1世代前のライブラリです。 ピックアップ処理 ピックアップ処理とは、マウスで3Dオブジェクトを選択することです。これを行うことによりドラッグで移動、スケーリング、回転といった操作が可能になります。 OpenGL de プログラミング ピックアップ処理 マウスでクリックした場所の3次元位置を求めるには? 和歌山大学床井研究室
https://w.atwiki.jp/bambooflow/pages/313.html
Creator OpenGLのはじめ OpenGLのはじめ(v4.7対応) バージョン管理ツールGitを使う 設定
https://w.atwiki.jp/sugawara/pages/122.html
Qt Tips QStringクラスのメソッド、fromWCharArray()やtoStdWString()などを使うとリンクエラーとなる場合がある。 原因は、コンパイラオプションの「wchar_tをビルトイン型として扱う」設定がQtのDLLと異なっているため。バイナリで配布されているQtはこの設定が「いいえ」になっているので、Qtを呼び出す側も合わせる必要がある。 http //lists.qt.nokia.com/pipermail/qt-interest/2009-February/002272.html
https://w.atwiki.jp/june1st/pages/13.html
C++BuilderでVCLと共存してGLUTを使う ココのサンプルを参考に プロジェクトに追加で glut32.libと OpenGLのプログラム.c() ← glutInit( _argc, _argv)、glutCreateWindow("sample")、main() → (例えば)GLmain を追加 Project1.cppに USELIB("glut32.libのパス"); USEUNIT("OpenGLのプログラム.c"); Unit1.cpp側で extern "C" int GLmain(void); 外部関数として"OpenGLのプログラム.c"に書かれた関数を呼び出す グローバル変数も外部呼出ししてVCLでいじればおk UbuntuでGLUTを使う とりあえずsynapticでGLUTをインストール(GLUT3〜? gccのオプションに-lglut -lGLU -lGLをつける
https://w.atwiki.jp/qtfan/
Qt fanのページへようこそ! ここは、Trolltech社の開発しているアプリケーションフレームワーク、Qtの使い方を解説する個人ページです。 個人で勝手にやっているサイトなので、間違いや誤字脱字などがありますが、「こいつバカだなぁ」と笑ってお知らせ願えると幸いです。 Qtとは Qtは、Trolltech社の開発しているマルチプラットフォームフレームワークです。現在の最新バージョンは4.4になります。 ソースレベルで様々なプラットフォームに対応していて、サポートされているプラットフォームには以下のものがあります。 Windows WindowsCE Mac OS X X11 EmbeddedLinux X11版とEmbeddedLinux版の違いは、X11版はデスクトップマシン用、EmbeddedLinux版は組み込み端末用であるということです。X11版はもちろんX11上で表示をしますが、EmbeddedLinux版はLinuxのフレームバッファやvnc、X11上のバーチャルフレームバッファ等に表示を行います。 また、Trooltech社はNokiaに買収されました。もしかすると、Nokia端末用のQtが開発されるかもしれません。(現在は公開されていません) 各々のプラットフォームには2つのエディションが存在します。それは、サポートなどで区別され、以下のものがあります。 Commercial(商用、サポートあり) Open Source(非商用、サポートなし) ここでは誰でも使える非商用のOpen Source版でサンプルなどの解説をしていきます。 必要なシステム 基本的にはサポートされているシステムであれば苦もなく使用できます。 バイナリパッケージもありますので、ダウンロードしてきてインストールするだけで使えます。 Windows版 ダウンロードはここからできます。 上記のページにバイナリインストーラの.exeファイルとソースの.zipファイルがあります。通常はバイナリインストーラの.exeをダウンロードする方がよいでしょう。 インストール中にmingをインストールするか聞かれます。 Open Source版のコンパイルにはmingを使用しますので、インストールしていない場合は指示にしたがいインストールしましょう。忘れるとコンパイルできません。 Mac OS X版 ダウンロードはここからできます。 上記のページにはソースの.tar.gzファイルがあります。コンパイルしてインストールしなければいけません。コンパイルにはMac OS X標準の開発ツールが必要です。 ソースのコンパイルにはコマンドラインから実行するのが手っ取り早いです。ターミナルを起動し、以下の手順でコンパイル、インストールします。なお、コンパイルには相当な時間が必要です。 tar xvfz qt-mac-opensource-src-4.4.0.tar.gz cd qt-mac-opensource-src-4.4.0 configure make sudo make install 上記の手順で/usr/local/Trolltech/Qt-4.4.0というディレクトリにQtがインストールされます。このディレクトリ内にbinディレクトリがあり、その中にツール類が納められていますので、パスを通すのを忘れないでください。 export PATH=/usr/local/Trolltech/Qt-4.4.0/bin $PATH X11版 ダウンロードはここからできます。 上記のページにはソースファイルの.tar.gzファイルがあります。コンパイルしてインストールしなければいけません。コンパイラはgccとg++が必要になります。 Linuxなどのディストリビューションでバイナリパッケージがある場合は、そちらをインストールする方が手っ取り早いでしょう。 WindowsCE版 ダウンロードはここからできます。 上記のページに行くと、5秒後にソースファイルのダウンロードが始まります。コンパイルしてインストールしなければいけません。コンパイラはWindowsMobileSDKが必要になります。 EmbeddedLinux版 ダウンロードはここからできます。 上記のページに行くと、5秒後にソースファイルのダウンロードが始まります。コンパイルしてインストールしなければいけません。コンパイラはgccとg++が必要になります。
https://w.atwiki.jp/usonx/pages/21.html
VC++(MFC)とOpenGL MFCとOpenGLの親和性は高い。逆にMFCとDirectXの親和性は低く、現在のバージョンにおいて、MFC+DirectXの組み合わせは難しい。理由としては、そもそもDirectX自体がMFCを前提としなくなったこと。SampleからMFCtex(MFC+DirectXのサンプル)が消えている。MFCtexがあるバージョンは、DirectX9(2003)のようだが、探した限りではMicrosoft上には見当たらなかった(仮にあったとしてもVC++6のものとなる。VC++2005では、そのままコンパイルできない)。 OpenGLのインストール 1.GLUTのダウンロード 下記サイトから"glut-3.7.6-bin.zip"をダウンロードし、適当なフォルダに解凍する。 http //www.xmission.com/~nate/glut.html 2.ファイルのコピー 解凍したファイルを下記ディレクトリに移動する。フォルダ名は環境によって若干異なる。.hは、GLフォルダを作りその中に入れること。 glut.h → C \Program Files\Microsoft Visual Studio\VC98\Include\GL .lib → C \Program Files\Microsoft Visual Studio\VC98\Lib .dll → C \WINDOWS\SYSTEM32 MFC(ダイアログベース)+OpenGL プロジェクト名をhogeとすると、 1.ヘッダファイルの記述 クラスChogeDlgに以下includeを追加 \#include GL/glaux.h 2.メンバ変数の追加 クラスChogeDlgに以下変数を追加する CDC* m_pDC; HGLRC m_GLRC; 3.メンバ関数の追加 int ChogeDlg SetDCPixelFormat(HDC hdc) { static PIXELFORMATDESCRIPTOR pfd = { sizeof (PIXELFORMATDESCRIPTOR),// Size of this structure 1,// Version number PFD_DRAW_TO_WINDOW |// Flags PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA,// RGBA pixel values 24,// 24-bit color 0, 0, 0, 0, 0, 0,// Don t care about these 0, 0,// No alpha buffer 0, 0, 0, 0, 0,// No accumulation buffer 32,// 32-bit depth buffer 0,// No stencil buffer 0,// No auxiliary buffers PFD_MAIN_PLANE,// Layer type 0,// Reserved (must be 0) 0, 0, 0// No layer masks }; int nPixelFormat; nPixelFormat = ChoosePixelFormat (hdc, pfd); if (SetPixelFormat(hdc, nPixelFormat, pfd) == FALSE){ // SetPixelFormat error return FALSE ; } if (DescribePixelFormat(hdc, nPixelFormat, sizeof(PIXELFORMATDESCRIPTOR), pfd) == 0) { // DescribePixelFormat error return FALSE ; } if (pfd.dwFlags PFD_NEED_PALETTE) { // Need palete ! } return TRUE ; } void ChogeDlg InitGL() { m_pDC = new CClientDC(this); // Get device context SetDCPixelFormat(m_pDC- m_hDC); // Set OpenGL pixel format m_GLRC = wglCreateContext (m_pDC- m_hDC); // Create rendering context wglMakeCurrent (m_pDC- m_hDC, m_GLRC); // Current context set glClearColor(0.0f, 0.0f, 0.5f, 1.0f); } void ChogeDlg DrawGL() { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) ; } BOOL ChogeDlg OnInitDialog() の return TRUE; の上に InitGL(); を追加する. ClassView@ChogeDlg→メッセージ で WM_DESTROY をダブルクリックし, OnDestroy を呼ぶ. void ChogeDlg OnDestroy() { CView OnDestroy(); // TODO この位置にメッセージ ハンドラ用のコードを追加してください wglMakeCurrent(NULL, NULL); // free current context wglDeleteContext(m_GLRC); // Delete rendering context delete m_pDC; // Release device context } OnPaint に以下の文を追加. void COpenGLTest2Dlg OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 描画用のデバイス コンテキスト SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // クライアントの矩形領域内の中央 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect( rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // アイコンを描画します。 dc.DrawIcon(x, y, m_hIcon); } else { CDialog OnPaint(); DrawGL(); //これを追加 SwapBuffers(m_pDC- m_hDC); //これを追加 } } Pictureコントロール上に描画するには、 ダイアログにピクチャボックスを設置する.(大きさは適当) ID→ID_PICT に書き換え,クラスウィザードで ID_PICT の変数を追加する. コントロールID タイプ メンバ IDC_PICT CStatic m_Pict InitGL() に一文を追加する. void COpenGLTest2Dlg InitGL() { m_pDC = new CClientDC(this); m_pDC- m_hDC = m_Pict.GetDC()- GetSafeHdc(); //これを追加 SetDCPixelFormat(m_pDC- m_hDC); m_GLRC = wglCreateContext (m_pDC- m_hDC); wglMakeCurrent (m_pDC- m_hDC, m_GLRC); glClearColor(0.0f, 0.0f, 0.5f, 1.0f); }
https://w.atwiki.jp/opengl/pages/286.html
こちらに OpenGL Simple Adapter があるので使わせてもらいます。 nursの日記http //d.hatena.ne.jp/nurs/20080315/1205598655 使い方は OpenGL Simple Adapter.h をインクルードして OpenGLSimpleAdapter のインスタンスを作成して GLAdapter- BeginRender(); と GLAdapter- EndRender(); の間に いつもの OpenGL のコードを記述するだけです。 OpenGL Simple Adapter.h #pragma once #pragma comment( lib, opengl32.lib ) #pragma comment( lib, glu32.lib ) #pragma comment( lib, gdi32.lib ) #pragma comment( lib, User32.lib ) #include windows.h #include gl/gl.h #include gl/glu.h //↑こいつの#include は、たぶんこことかではなく、 // コードの中でもusing namespace System;とか記述する // よりも前にしないと、C2872 に苦しめられることになる。 public ref class OpenGLSimpleAdapter // ↑CLRでやる場合は、class の前に、public ref を入れてね { // // OpenGL Simple Adaptor loOGLHost (C) 2008 nurs // // 使い方: // 1)本クラスのインスタンスを、ターゲットビューのメンバとして作成する。 // コンストラクタのHDCは、Win32なら // ⇒ GetDC( this- GetSafeHwnd() ) ); // CLRのFormなら、 // ⇒ GetDC( (HWND)parentForm- Handle.ToPointer() ); // などとして取ってきます。 // 2)ターゲットビューの、適切な箇所(初期化、描画、リサイズ)にて、 // 本ホストの、BeginRender()と、EndRender() を呼び出し、その間に、 // 目的のOpenGL描画コードを記述します。 // *)ちなみに利用側コードのどこかのcpp内にて、 //#pragma comment( lib, opengl32.lib ) //#pragma comment( lib, glu32.lib ) //#pragma comment( lib, gdi32.lib ) //#pragma comment( lib, User32.lib ) // の記述も、忘れないで下さい。 // // ★RenderPolicyを予め作成しておき、必要なときに必要な描画 // ポリシーで、Render() をかける、という使い方もできます。 // ★注意:WindowsForm、.NET環境の場合は、プロジェクトの共通言語 // ランタイムサポートを、/clr pure ではなく、/clr にする。 // // public OpenGLSimpleAdapter( HDC dc ){ if(dc==0) return; m_hdc = dc; { static PIXELFORMATDESCRIPTOR pfd={ sizeof(PIXELFORMATDESCRIPTOR), 1, PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_DOUBLEBUFFER, PFD_TYPE_RGBA, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16, 0, 0, PFD_MAIN_PLANE, 0, 0, 0, 0 }; GLint iPixelFormat; if( (iPixelFormat = ChoosePixelFormat(m_hdc, pfd) ) == 0) return; if(SetPixelFormat(m_hdc, iPixelFormat, pfd) == FALSE) return; } if( (m_hglrc = wglCreateContext(m_hdc) )==0) return; // pure Managed だとランタイムでエラーに if( (wglMakeCurrent(m_hdc, m_hglrc) )==0) return; wglMakeCurrent(0, 0); return; } ~OpenGLSimpleAdapter( void ){} template class RenderPolicy void Render( RenderPolicy po ){ wglMakeCurrent( this- m_hdc, this- m_hglrc ); po(); wglMakeCurrent( this- m_hdc, 0 ); SwapBuffers( this- m_hdc ); } HDC BeginRender( void ){ wglMakeCurrent( this- m_hdc, this- m_hglrc ); return this- m_hdc; } void EndRender( void ){ wglMakeCurrent( this- m_hdc, 0 ); SwapBuffers( this- m_hdc ); } void EndRenderNoSwap( void ){ wglMakeCurrent( this- m_hdc, 0 ); } private HDC m_hdc; HGLRC m_hglrc; }; /*使用例 まず、OpenGLSimpleAdapterのインスタンスを作成します。 そして、BeginRender() と、EndRender() の間に目的のOpenGLのgl描画コードを書きます。 private System Void Form1_Load(System Object^ sender, System EventArgs^ e) { GLAdapter = gcnew OpenGLSimpleAdapter(GetDC( (HWND)panel1- Handle.ToPointer() )); } private System Void panel1_Paint(System Object^ sender, System Windows Forms PaintEventArgs^ e) { GLAdapter- BeginRender(); { glClearColor( 0,0,0,0 ); glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT ); } GLAdapter- EndRender(); } */ MyForm.cpp #pragma comment(linker, /SUBSYSTEM WINDOWS /ENTRY mainCRTStartup ) #include MyForm.h using namespace opengl; [STAThreadAttribute] int main(){ MyForm ^form1 = gcnew MyForm; form1- ShowDialog(); return 0; } MyForm.h #pragma once #include OpenGL Simple Adapter.h namespace opengl { using namespace System; using namespace System ComponentModel; using namespace System Collections; using namespace System Windows Forms; using namespace System Data; using namespace System Drawing; /// summary /// MyForm の概要 /// /summary public ref class MyForm public System Windows Forms Form { public MyForm(void) { InitializeComponent(); // //TODO ここにコンストラクター コードを追加します // } protected /// summary /// 使用中のリソースをすべてクリーンアップします。 /// /summary ~MyForm() { if (components) { delete components; } } private System Windows Forms Panel^ panel1; protected private /// summary /// 必要なデザイナー変数です。 /// /summary System ComponentModel Container ^components; #pragma region Windows Form Designer generated code /// summary /// デザイナー サポートに必要なメソッドです。このメソッドの内容を /// コード エディターで変更しないでください。 /// /summary void InitializeComponent(void) { this- panel1 = (gcnew System Windows Forms Panel()); this- SuspendLayout(); // // panel1 // this- panel1- Location = System Drawing Point(24, 24); this- panel1- Name = L panel1 ; this- panel1- Size = System Drawing Size(218, 182); this- panel1- TabIndex = 0; this- panel1- Paint += gcnew System Windows Forms PaintEventHandler(this, MyForm panel1_Paint); // // MyForm // this- AutoScaleDimensions = System Drawing SizeF(6, 12); this- AutoScaleMode = System Windows Forms AutoScaleMode Font; this- ClientSize = System Drawing Size(284, 261); this- Controls- Add(this- panel1); this- Name = L MyForm ; this- Text = L MyForm ; this- ResumeLayout(false); } #pragma endregion void Line2D(int x1,int y1,int x2, int y2,float size){ glLineWidth(size); glBegin(GL_LINES); glVertex2i(x1,y1); glVertex2i(x2,y2); glEnd(); } private System Void panel1_Paint(System Object^ sender, System Windows Forms PaintEventArgs^ e) { OpenGLSimpleAdapter^ GLAdapter = gcnew OpenGLSimpleAdapter(GetDC( (HWND)panel1- Handle.ToPointer() )); GLAdapter- BeginRender(); { glClearColor( 0,0,0,0 ); glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT ); glOrtho(0, panel1- Width, panel1- Height, 0, -1, 1); glColor4f(1.0f,1.0f,1.0f,1.0f); Line2D(20,40,200,180,1.0); } GLAdapter- EndRender(); } }; }
https://w.atwiki.jp/sevenlives/pages/2256.html
GLUT OpenGL ES GLSL? WebGL OpenCL? シリコングラフィックス?
https://w.atwiki.jp/bambooflow/pages/87.html
スレッドQThread 1つのスレッドを生成。Widget上にボタンを作成してボタンをクリックするごとにスレッドを1ステップ処理させる。 スレッドスタートボタン printf表示 スレッド動作 ↓正しい記述方法かはわからんですが、とりあえず動いたので。 mythread.h #ifndef __MYTHREAD_H#define __MYTHREAD_H #include QThread #include QWaitCondition #include QMutex class MyThread public QThread { Q_OBJECT public MyThread( QObject *parent=0 ); public slots void active(); protected void run(); private QWaitCondition condition; QMutex mutex;}; #endif mythread.cpp #include "mythread.h" #include cstdio MyThread MyThread( QObject *parent ) QThread(parent){} void MyThread active(){ condition.wakeOne(); //printf( "actived\n" );} void MyThread run() { int no=0; while (true) { for (int i=0; i 10; ++i) { printf( "no=%d, loop=%d\n", no, i ); } ++no; mutex.lock(); condition.wait( mutex ); mutex.unlock(); }} run関数がスレッド関数で無限ループとなっている。 mywidgetのコンストラクタでmythread- start()を呼ぶことで、処理を開始する。 condition.wait()のところで一旦停止、condition.wakeOne()を呼ぶことで次の処理へ進む。 スロットのactive()はQPushButtonのclicked()のシグナルと接続した。 mythread.h mythread.cpp mywidget.h mywidget.cpp main.cpp メモ スロットを持たせようとした場合、Q_OBJECTをクラスの定義内に記述しないといけないみたいだけど、コンパイルしていたら次のメッセージがリンク時に出てエラーになってしまった。 "undefined reference to vtable for xxxxxx" これはどうもmocというものを自動生成されるときにうまくいっていないのが原因みたい。 いろいろためしてみたら、1つのファイル(.cpp)にクラスの定義やmainを書いてしまったのが原因のよう。 1つのクラス定義に対して1つのオブジェクトが生成されるように.cppと.hファイルを作成してmain関数が含まれるものをmain.cppとわけてあげたら問題なくコンパイルできた。 mythread.h内の#include QThread のところをclass QThread;にしようと思ったんだけど、なんかうまくいかない。 mocファイルを生成するときはヘッダにヘッダを書かないとダメなのか? 関連 QtCore QThread QMutex QMutexLocker QWaitCondition 参考にしたページ http //doc.trolltech.com/4.3/threads.html http //qt.linux-life.net/4/doc/ja/signalsandslots.html 以上